using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class use
{
    static Dictionary<string, string> userDict = new Dictionary<string, string>();

    public static void RunUserAuth()
    {
        bool isRunning = true;
        while (isRunning)
        {
            ShowMainMenu();
            string choice = Console.ReadLine();
            switch (choice)
            {
                case "1":
                    Login();
                    break;
                case "2":
                    Register();
                    break;
                case "3":
                    isRunning = false;
                    Console.WriteLine("退出用户系统，再见！");
                    break;
                default:
                    Console.WriteLine("请输入有效数字（1-3），按回车继续...");
                    Console.ReadLine();
                    break;
            }
        }
    }

    static void ShowMainMenu()
    {
        Console.Clear();
        Console.WriteLine("===== 用户登录注册系统 =====");
        Console.WriteLine("1. 登录");
        Console.WriteLine("2. 注册");
        Console.WriteLine("3. 退出");
        Console.Write("请选择功能：");
    }

    static void Register()
    {
        Console.Clear();
        Console.WriteLine("===== 用户注册 =====");

        // 用户名验证
        string username;
        while (true)
        {
            Console.Write("请输入用户名（3-15个字符，仅含字母、数字、下划线）：");
            username = Console.ReadLine().Trim();

            if (!IsNotEmpty(username))
            {
                Console.WriteLine("用户名不可为空，请重新输入！");
                continue;
            }

            if (!IsValidUsername(username))
            {
                Console.WriteLine("用户名格式错误（长度3-15，仅含字母、数字、下划线），请重新输入！");
                continue;
            }

            if (userDict.ContainsKey(username))
            {
                Console.WriteLine("该用户名已存在，请重新输入！");
                continue;
            }

            break;
        }

        // 密码及确认密码验证
        string password;
        while (true)
        {
            Console.Write("请输入密码（6-20个字符，需包含大写、小写、数字）：");
            password = Console.ReadLine();

            if (!IsNotEmpty(password))
            {
                Console.WriteLine("密码不可为空，请重新输入！");
                continue;
            }

            if (!IsValidPassword(password))
            {
                Console.WriteLine("密码格式错误（需6-20字符，含大、小写字母和数字），请重新输入！");
                continue;
            }

            Console.Write("请确认密码：");
            string confirmPwd = Console.ReadLine();

            if (password != confirmPwd)
            {
                Console.WriteLine("两次密码不一致，请重新输入！");
                continue;
            }

            break;
        }

        userDict.Add(username, password);
        Console.WriteLine("注册成功！按回车键返回主菜单...");
        Console.ReadLine();
    }

    static void Login()
    {
        Console.Clear();
        Console.WriteLine("===== 用户登录 =====");

        Console.Write("请输入用户名：");
        string username = Console.ReadLine().Trim();

        Console.Write("请输入密码：");
        string password = Console.ReadLine();

        if (!IsNotEmpty(username) || !IsNotEmpty(password))
        {
            Console.WriteLine("用户名或密码不可为空！按回车键返回...");
            Console.ReadLine();
            return;
        }

        if (userDict.TryGetValue(username, out string storedPwd))
        {
            if (storedPwd == password)
            {
                Console.WriteLine("登录成功！模拟进入系统首页...");
                Console.WriteLine("（此处可扩展系统首页逻辑）");
                Console.WriteLine("按回车键返回主菜单...");
                Console.ReadLine();
            }
            else
            {
                Console.WriteLine("密码错误！按回车键返回...");
                Console.ReadLine();
            }
        }
        else
        {
            Console.WriteLine("用户名不存在！按回车键返回...");
            Console.ReadLine();
        }
    }

    // 验证用户名格式（3-15字符，仅字母、数字、下划线）
    static bool IsValidUsername(string username) => Regex.IsMatch(username, @"^[a-zA-Z0-9_]{3,15}$");

    // 验证密码格式（6-20字符，含至少1个大写、1个小写、1个数字）
    static bool IsValidPassword(string password) => Regex.IsMatch(password, @"^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{6,20}$");

    // 验证输入非空（非null、非纯空格）
    static bool IsNotEmpty(string input) => !string.IsNullOrWhiteSpace(input);
}